package com.ntd.study.base.thread;

import cn.hutool.core.lang.Console;
import ntd.util.UtilThread;
import lombok.Data;

/**
 * volatile 关键字测试
 * 内存可见性
 * jvm 为每一个线程分配一个独立的缓存
 * 当多个线程操作共享数据时，彼此不可见
 * volatile 多个线程操作共享数据时，可以保证内存中的数据是可见的，修改时候实时刷新到主存储中
 * volatile 多个线程读取数据时，每次都从主存储中读取
 * 相较于 synchronized 是一种较为轻量级的同步策略
 * 1.不具备互斥性
 * 2.不能保证变量的原子性（原子-不可分割）
 */
public class DemoThreadVolatile {
    public static void main(String[] args) {
        DemoThread thread = new DemoThread();
        new Thread(thread).start();
        while (true) { // 执行效率非常高-没有机会从主存储获取数据
//            synchronized (thread) { // 每次都去主存储重新获取数据
//
//            }
            if (thread.isFlag()) {
                Console.log("--------------------------");
                break;
            }
        }
    }

    @Data
    static class DemoThread implements Runnable {
        private volatile boolean flag = false;

        @Override
        public void run() {
            UtilThread.sleep(200);
            flag = true;
            Console.log(flag);
        }
    }
}

